package com.qjc.demo.jvm.线上调优;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName: JVMTest
 * @Author: qjc
 * @Date: 2023/9/8 16:54
 */
@RestController
@RequestMapping("/jvm")
public class JVMTest {

    // IDEA启动参数：-Xms100M -Xmx100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/qjc/Documents/workspace/StudyProjects/demo-summary/dump
    // -XX:HeapDumpPath  会把dump文件生成到dump文件夹下
    /**
     * 测试OOM（Out Of Memory）异常的接口方法
     * 该方法通过不断创建大字节数组并添加到列表中来模拟内存溢出场景
     *
     * @return 返回字符串类型的结果（理论上无法正常返回，因为会抛出OOM异常）
     * @throws InterruptedException 当线程被中断时抛出此异常
     */
    @GetMapping("/oom")
    public String testOOM() throws InterruptedException {
        // 创建一个字节列表用于存储大量数据
        List<byte[]> list = new ArrayList<>();
        // 无限循环，持续分配内存直到发生OOM
        while (true) {
            // 每次创建100MB的字节数组
            byte[] bytes = new byte[100 * 1024 * 1024];
            // 将创建的字节数组添加到列表中
            list.add(bytes);
            // 每次循环间隔1秒
            TimeUnit.SECONDS.sleep(1);
        }
    }


    // 排查生产环境问题
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        while (true) {
            list.add(new String(UUID.randomUUID().toString()));
        }
    }

}
